express参数过滤

express 介绍

Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用。

简单说下参数安全

今天说下,参数过滤,我们结果对外暴露的所有接口参数,我们需要在request接收的时候,进行参数校验,说白一点,不管是入参还是出参,我们都得做好统一处理。

今天我来在express里面来给大家讲下如何实现参数校验。
1.首先我们定义一个路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
index.js

module.exports = app => {
app.use('/validateData', validate);

app.use('/', page);
};

route.js

var express = require('express');
var router = express.Router();
var validate = require('../controller/common/validate');
var apiWrapperReq = require('../middleware/apiWrapperReq');

router.get('/', apiWrapperReq.wrapperReq, validate.fetch);

module.exports = router;

2.我们需要给路由一个中间件。来控制参数,这里地方的apiwrapperReq里面需要做好处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 校验类型
validate(rules, params) {
let result = { ret: true, msg: [], data: {} };
let msg = [];
if (!params) {
return result;
}

_.each(rules, (type, key) => {
let key_rule = typeof type === 'object' ? type : { type };
let val = params[key];

// 是否必须
let required = key_rule.required && key_rule.required === true;
if (required && undefined === val) {
msg.push(`param ${key} is required!`);
}

// 转换类型,这里可以过滤非法字符,后面加入正则过滤
if (undefined !== val && val) {
try {
// 检查参数数据正则表达式的健壮性
if (!safe(val)) {
msg.push(`param ${key} is no no no!`);
}

// 转换一下。转换失败,不通过。
params[key] = this.convertType(val, key_rule);
} catch (ex) {
msg.push(`param ${key} is error!`);
}
}
});

return {
ret: msg.length === 0,
msg: msg,
data: params
};
}

3.上面的接受了2个参数,一个是rules,一个params。我们需要获取一个rules。对应每一个接口都得有一个rules。下面我们整理下规则的参数

我们需要对参数是否必须填写和参数的类型进行转换。这样保证我们的参数合法性。

1
2
3
4
5
6
7
8
9
10
module.exports = {
queryA: {
required: true,
type: 'string'
},
queryB: {
required: true,
type: 'int'
}
};

按照上述步骤去走我们的流程,判断下有校验规则的才走逻辑。不然跳过。我们知道做这个目的是,过滤一些正则表达式的攻击,防止参数中含有正则表达式的一些进行攻击数据库。简单的做一层。如果你觉得你的正则表达式不是很优雅,可以采用第三方库(safe-regex).来帮你你完成。